package com.starryx.sim.mvc.util;


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;


/**
 * json 工具
 */
public class JsonUtil {

	/**
	 * json 核心对象
	 */
	private static final ObjectMapper MAPPER;

	static {
		MAPPER = new ObjectMapper();
	}

	/**
	 * 将对象转化为 json 字符串
	 *
	 * @param obj 待转化对象
	 * @return json 字符串
	 */
	public static String toJson(Object obj) {
		try {
			return MAPPER.writeValueAsString(obj);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 将 json 字符串转化为对象
	 *
	 * @param json          json 字符串
	 * @param typeReference 复杂对象引用
	 * @param <T>           复杂对象类型
	 * @return 目标对象
	 */
	public static <T> T toObject(String json, TypeReference<T> typeReference) {
		try {
			return MAPPER.readValue(json, typeReference);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 将 json 字符串转化为对象
	 *
	 * @param json      json 字符串
	 * @param valueType 目标对象的 Class 对象
	 * @param <T>       目标对象类型
	 * @return 目标对象
	 */
	public static <T> T toObject(String json, Class<T> valueType) {
		try {
			return MAPPER.readValue(json, valueType);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
		}
		return null;
	}

}
